import { VNode, CSSProperties } from 'vue'
import { Dayjs } from 'dayjs'
import { MentionsProps } from 'ant-design-vue'
import type { SelectProps, CascaderProps, TreeSelectProps } from 'ant-design-vue'
import { FileProps } from '@/components/base/base-upload/BaseUpload.vue'
/****
 * 注意事项
 * 1、所有组件的value都通过最外层value设置
 * 2、defaultValue直接设置最外层的value即可
 * 3、所有组件的disabled都通过最外层disabled设置
 * 4、所有组件的size都通过最外层size设置
 * 5、所有表单项均以组件官网为准
 */
/**
 * 自动完成
 *
 */
interface AutoCompleteParams extends BaseFormItemParams {
  // 使用键盘选择选项的时候把选中项回填到输入框中
  backfill?: boolean
  // 自定义输入框
  default?: unknown
  // 是否默认高亮第一个选项。
  defaultActiveFirstOption?: boolean
  // 下拉菜单和选择器同宽。默认将设置 min-width，当值小于选择框宽度时会被忽略。false 时会关闭虚拟滚动
  dropdownMatchSelectWidth?: boolean | number
  // dropdown 菜单自定义样式
  dropdownMenuStyle?: object
  // 是否根据输入项进行筛选。当其为一个函数时，会接收 inputValue option 两个参数，当 option 符合筛选条件时，应返回 true，反之则返回 false。
  filterOption?: boolean | Function
  // 通过 option 插槽，自定义节点
  option?: object
  // 控制显隐
  open?: boolean
  // 自定义的选择框清空图标
  clearIcon?: object
  // 自动完成的数据源
  options?: Array<{ value: string }>
}

/**
 * 级联
 */
interface CascaderParams extends BaseFormItemParams {
  // 自定义的选择框清空图标
  clearIcon?: object
  // （单选时生效）当此项为 true 时，点选每级菜单选项值都会发生变化，具体见上面的演示
  changeOnSelect?: boolean
  // 默认的选中项。
  defaultValue?: string[] | number[]
  // 选择后展示的渲染函数,可使用 #displayRender="{labels, selectedOptions}"
  displayRender?: ({ labels, selectedOptions }: any) => VNode
  // 次级菜单的展开方式
  expandTrigger?: 'click' | 'hover'
  // 是自定义 options 中 label name children 的字段
  fieldNames?: BaseFieldNames
  // 支持多选节点
  multiple?: boolean
  // 当下拉列表为空时显示的内容
  notFoundContent?: string | unknown
  // 设置搜索的值，需要与 showSearch 配合使用
  searchValue?: string
  // 在选择框中显示搜索框
  showSearch?:
    | boolean
    | {
        // 接收 inputValue path 两个参数，当 path 符合筛选条件时，应返回 true，反之则返回 false。
        filter: (inputValue: any, path: any) => boolean
        // 搜索结果展示数量
        limit: number | false
        // 搜索结果列表是否与输入框同宽
        matchInputWidth: boolean
        // 用于渲染 filter 后的选项,可使用 #showSearchRender="{inputValue, path}"
        render: (inputValue: any, path: any) => VNode
        // 用于排序 filter 后的选项
        sort: (a: any, b: any, inputValue: any) => void
      }
  // 控制显隐
  open?: boolean
  options?: BaseOptions
}

/**
 * 多选
 */
interface CheckBoxParams extends BaseFormItemParams {
  // 指定当前是否选中
  checked?: boolean
  // 失效状态
  disabled?: boolean
  // 设置 indeterminate 状态，只负责样式控制
  indeterminate?: boolean
  // 与 CheckboxGroup 组合使用时的值
  value?: boolean | string | number
  // 复选组
  checkboxGroup?: {
    // 整组失效
    disabled?: boolean
    //  CheckboxGroup 下所有 input[type="checkbox"] 的 name 属性
    name?: string
    // 失效状态
    options?:
      | string[]
      | Array<{
          label: string
          value: string
          disabled?: boolean
          indeterminate?: boolean
          onChange?: Function
        }>
    // 指定选中的选项
    value?: string[]
  }
}

/**
 * 时间选择
 */
interface DatePickerParams extends BaseDatePicker {
  // 默认面板日期
  defaultPickerValue?: Dayjs
  // 不可选择的时间
  disabledTime?: (date: Dayjs) => void
  // 设置日期格式，为数组时支持多格式匹配，展示以第一个为准。配置参考 dayjs，支持自定义格式
  format?: string | unknown
  // 当设定了 showTime 的时候，面板是否显示“此刻”按钮
  showNow?: boolean
  //增加时间选择功能
  showTime?: Object | boolean
  // 设置用户选择日期时默认的时分秒
  defaultValue?: Dayjs
  // 是否展示“今天”按钮
  showToday?: boolean
}

/**
 * 时间范围选择
 */
interface RangePickerParams extends BaseDatePicker {
  // 允许起始项部分为空
  allowEmpty?: [boolean, boolean]
  // 自定义日期单元格的内容
  dateRender?: any
  // 默认面板日期
  defaultPickerValue?: Dayjs[]
  // 不可选择的时间
  disabledTime?: (date: Dayjs) => void
  // 设置日期格式，为数组时支持多格式匹配，展示以第一个为准。配置参考 dayjs，支持自定义格式
  format?: string | unknown
  //增加时间选择功能
  showTime?: Object | boolean
  // 预设时间范围快捷选择
  ranges?: { [range: string]: Dayjs[] } | { [range: string]: () => Dayjs[] }
  // 在面板中添加额外的页脚
  renderExtraFooter?: any
  // 设置分隔符
  separator?: string
  // 设置用户选择日期时默认的时分秒
  defaultValue?: Dayjs
}

/**
 * 输入
 */
interface InputParams extends BaseFormItemParams {
  // 带标签的 input，设置后置标签
  addonAfter?: string | any
  // 带标签的 input，设置前置标签
  addonBefore?: string | any
  // 输入框默认内容
  defaultValue?: string
  // 输入框的 id
  id?: string
  // 最大长度
  maxlength?: number
  // 带有前缀图标的 input
  prefix?: string | any
  // 是否展示字数
  showCount?: boolean
  // 带有前缀图标的 input
  suffix?: string | any
  // 声明 input 类型，同原生 input 标签的 type 属性，见：MDN(请直接使用 <a-textarea /> 代替 type="textarea")。
  type?: string | 'textarea' | 'password' | 'search'
}

/**
 * 数字输入
 */
interface InputNumberParams extends BaseFormItemParams {
  // 带标签的 input，设置后置标签
  addonAfter?: string | any
  // 带标签的 input，设置前置标签
  addonBefore?: string | any
  // 是否显示增减按钮
  controls?: boolean
  // 小数点
  decimalSeparator?: string
  // 输入框默认内容
  defaultValue?: string
  // 指定输入框展示值的格式
  formatter?: (value: number | string, info: { userTyping: boolean; input: string }) => string
  // 是否启用键盘快捷行为
  keyboard?: boolean
  // 最大值
  max?: number
  // 最小值
  min?: number
  // 指定从 formatter 里转换回数字的方式，和 formatter 搭配使用
  parser?: (value: string) => number
  // 数值精度
  precision?: number
  // 带有前缀图标的 input
  prefix?: string | any
  // 每次改变步数，可以为小数
  step?: number | string
  // 字符值模式，开启后支持高精度小数。同时 change 事件将返回 string 类型
  stringMode?: boolean
}

/**
 * 提及
 */
interface MentionsParams extends BaseFormItemParams {
  // 自定义过滤逻辑
  filterOption?: (input: string, option: { value: string }) => boolean
  // 指定建议框挂载的 HTML 节点
  getPopupContainer?: (node: Node) => Node
  // 当下拉列表为空时显示的内容
  notFoundContent?: string
  // 弹出层展示位置
  placement?: 'top' | 'bottom'
  // 设置触发关键字
  prefix?: string | string[]
  // 设置选中项前后分隔符
  split?: string
  // 自定义触发验证逻辑
  validateSearch?: (text: string, props: MentionsProps) => void
  // 选项值
  options?: Array<BaseFieldNames>
}

/**
 * 单选
 */
interface RadioParams extends BaseFormItemParams {
  // 指定当前是否选中
  checked?: boolean
  // RadioButton 的风格样式，目前有描边和填色两种风格
  buttonStyle?: 'outline' | 'solid'
  // RadioGroup 下所有 input[type="radio"] 的 name 属性
  name?: string
  // 以配置形式设置子元素
  options?: BaseOptions
  // 用于设置 Radio options 类型
  optionType?: 'default' | 'button'
}

/**
 * 评分
 */
interface RateParams extends BaseFormItemParams {
  // 是否允许半选
  allowHalf?: boolean
  // 自定义字符
  character?: string
  // star 总数
  count?: number
  // 自定义每项的提示信息
  tooltips?: string[]
}

/**
 * 选择器
 */
interface SelectParams extends BaseFormItemParams {
  // 是否在选中项后清空搜索框，只在 mode 为 multiple 或 tags 时有效。
  autoClearSearchValue?: boolean
  // 自定义的多选框清空图标
  clearIcon?: VNode
  // 是否默认高亮第一个选项
  defaultActiveFirstOption?: boolean
  // 是否默认展开下拉菜单
  defaultOpen?: boolean
  // 下拉菜单的 className 属性
  dropdownClassName?: string
  // 下拉菜单和选择器同宽。默认将设置 min-width，当值小于选择框宽度时会被忽略。false 时会关闭虚拟滚动
  dropdownMatchSelectWidth?: boolean | number
  // dropdown 菜单自定义样式
  dropdownMenuStyle?: object
  // 自定义下拉框内容
  dropdownRender?: any
  // 下拉菜单的 styles 属性
  dropdownStyle?: object
  // 自定义节点 label、value、options 的字段
  fieldNames?: BaseOptions
  // 是否根据输入项进行筛选。当其为一个函数时，会接收 inputValue option 两个参数，当 option 符合筛选条件时，应返回 true，反之则返回 false。
  filterOption?: (inputValue: string, option: unknown) => boolean | boolean
  // 搜索时对筛选结果项的排序函数, 类似Array.sort里的 compareFunction
  filterSort?: (optionA: BaseOptions, optionB: BaseOptions) => number
  // 默认高亮的选项
  firstActiveValue?: string | string[]
  // 菜单渲染父节点。默认渲染到 body 上，如果你遇到菜单滚动定位问题，试试修改为滚动的区域，并相对其定位。
  getPopupContainer?: (node: Node) => Node
  // 是否把每个选项的 label 包装到 value 中，会把 Select 的 value 类型从 string 变为 {key: string, label: vNodes, originLabel: any} 的格式,
  // originLabel（3.1） 保持原始类型，如果通过 a-select-option children 构造的节点，该值是是个函数（即 a-select-option 的默认插槽）
  labelInValue?: boolean
  // 设置弹窗滚动高度
  listHeight?: number
  // 最多显示多少个 tag
  maxTagCount?: number
  // 最大显示的 tag 文本长度
  maxTagTextLength?: number
  // 自定义当前选中的条目图标
  menuItemSelectedIcon?: VNode
  // 设置 Select 的模式为多选或标签
  mode?: 'multiple' | 'tags' | 'combobox'
  // 当下拉列表为空时显示的内容
  notFoundContent?: string
  // 是否展开下拉菜单
  open?: boolean
  // 通过 option 插槽，自定义节点
  option?: BaseOptions
  // 搜索时过滤对应的 option 属性，不支持 children
  optionFilterProp?: string
  // 回填到选择框的 Option 的属性值，默认是 Option 的子元素。比如在子元素需要高亮效果时，此值可以设为 value。
  optionLabelProp?: string
  // options 数据，如果设置则不需要手动构造 selectOption 节点
  options?: Array<BaseOptions>
  // 自定义的多选框清除图标
  removeIcon?: VNode
  // 控制搜索文本
  searchValue?: string
  // 是否显示下拉小箭头
  showArrow?: boolean
  // 使单选模式可搜索
  showSearch?: boolean
  // 自定义的选择框后缀图标
  suffixIcon?: VNode
  // 自定义 tag 内容 render，仅在 mode 为 multiple 或 tags 时生效
  tagRender?: (props: any) => any
  // 在 tags 和 multiple 模式下自动分词的分隔符
  tokenSeparators?: string[]
  // 设置 false 时关闭虚拟滚动
  virtual?: boolean
  // 是否禁用
  disabled?: boolean
  // 提示
  placeholder?: string
}

/**
 * 滑动输入条
 */
interface SliderParams extends BaseFormItemParams {
  // 是否只能拖拽到刻度上
  dots?: boolean
  // Tooltip 渲染父节点，默认渲染到 body 上。
  getTooltipPopupContainer?: Function
  // marks 不为空对象时有效，值为 true 时表示值为包含关系，false 表示并列
  included?: boolean
  // 自定义刻度标记
  mark?: { point: number; label: any }
  // 刻度标记，key 的类型必须为 number 且取值在闭区间 [min, max] 内，每个标签可以单独设置样式
  marks?: { number: string | VNode } | { number: { style: object; label: string | VNode } } | { number: () => VNode }
  // 最大值
  max?: number
  // 最小值
  min?: number
  // 双滑块模式
  range?: boolean
  // 反向坐标轴
  reverse?: boolean
  // 步长，取值必须大于 0，并且可被 (max - min) 整除。当 marks 不为空对象时，可以设置 step 为 null，此时 Slider 的可选值仅有 marks 标出来的部分。
  step?: number | null
  // Slider 会把当前值传给 tipFormatter，并在 Tooltip 中显示 tipFormatter 的返回值，若为 null，则隐藏 Tooltip。
  tipFormatter?: Function | null
  // 设置 Tooltip 展示位置。参考 Tooltip。
  tooltipPlacement?: string
  // 值为true时，Tooltip 将会始终显示；否则始终不显示，哪怕在拖拽及移入时。
  tooltipVisible?: boolean
  // 值为 true 时，Slider 为垂直方向
  vertical?: boolean
}

/**
 * 开关
 */
interface SwitchParams extends BaseFormItemParams {
  // 指定当前是否选中
  checked?: {
    checkedValue: boolean | string | number
    unCheckedValue: boolean | string | number
  }
  //选中时的内容
  checkedChildren?: string
  // 选中时的值
  checkedValue?: boolean | string | number
  // 加载中的开关
  loading?: boolean
  // 非选中时的内容
  unCheckedChildren?: string
  // 非选中时的值
  unCheckedValue?: boolean | string | number
}

/**
 * 时间选择框
 */
interface TimePickerParams extends BaseFormItemParams {
  // 自定义的清除图标
  clearIcon?: string
  // 清除按钮的提示文案
  clearText?: string
  // 禁止选择部分小时选项
  disabledHours?: () => void
  // 禁止选择部分分钟选项
  disabledMinutes?: (selectedHour: any) => void
  // 禁止选择部分秒选项
  disabledSeconds?: (selectedHour: any, selectedMinute: any) => void
  // 展示的时间格式
  format?: string
  // 定义浮层的容器，默认为 body 上新建 div
  getPopupContainer?: (node: Node) => Node
  // 隐藏禁止选择的选项
  hideDisabledOptions?: boolean
  // 小时选项间隔
  hourStep?: number
  // 设置输入框为只读（避免在移动设备上打开虚拟键盘）
  inputReadOnly?: boolean
  // 分钟选项间隔
  minuteStep?: number
  // 面板是否打开
  open?: boolean
  // 没有值的时候显示的内容
  placeholder?: string | [string, string]
  // 弹出层类名
  popupClassName?: string
  // 弹出层样式对象
  popupStyle?: object
  // 选择框底部显示自定义的内容
  renderExtraFooter?: any
  // 秒选项间隔
  secondStep?: number
  // 面板是否显示“此刻”按钮
  showNow?: boolean
  // 自定义的选择框后缀图标
  suffixIcon?: any
  // 使用 12 小时制，为 true 时 format 默认为 h:mm:ss a
  use12Hours?: boolean
  // 可选，绑定值的格式，对 value、defaultValue 起作用。不指定则绑定值为 dayjs 对象
  valueFormat?: string
}

/**
 * 时间范围选择框
 */
interface TimeRangePickerParams extends TimePickerParams {
  // 自定义的清除图标
  clearIcon?: string
  // 清除按钮的提示文案
  clearText?: string
  // 禁止选择部分小时选项
  disabledHours?: () => void
  // 禁止选择部分分钟选项
  disabledMinutes?: (selectedHour: any) => void
  // 禁止选择部分秒选项
  disabledSeconds?: (selectedHour: any, selectedMinute: any) => void
  // 展示的时间格式
  format?: string
  // 定义浮层的容器，默认为 body 上新建 div
  getPopupContainer?: (node: Node) => Node
  // 隐藏禁止选择的选项
  hideDisabledOptions?: boolean
  // 小时选项间隔
  hourStep?: number
  // 设置输入框为只读（避免在移动设备上打开虚拟键盘）
  inputReadOnly?: boolean
  // 分钟选项间隔
  minuteStep?: number
  // 面板是否打开
  open?: boolean
  // 没有值的时候显示的内容
  placeholder?: string | [string, string]
  // 弹出层类名
  popupClassName?: string
  // 弹出层样式对象
  popupStyle?: object
  // 选择框底部显示自定义的内容
  renderExtraFooter?: any
  // 秒选项间隔
  secondStep?: number
  // 面板是否显示“此刻”按钮
  showNow?: boolean
  // 自定义的选择框后缀图标
  suffixIcon?: any
  // 使用 12 小时制，为 true 时 format 默认为 h:mm:ss a
  use12Hours?: boolean
  // 可选，绑定值的格式，对 value、defaultValue 起作用。不指定则绑定值为 dayjs 对象
  valueFormat?: string
}

/**
 * 穿梭框
 */
interface TransferOptions {
  // 键
  key: string
  // 标题
  title: string
  // 描述
  description?: string
  // 是否禁用
  disabled?: boolean
}
interface TransferParams extends BaseFormItemParams {
  // 数据源，其中的数据将会被渲染到左边一栏中，targetKeys 中指定的除外。
  dataSource?: Array<TransferOptions>
  // 接收 inputValue option 两个参数，当 option 符合筛选条件时，应返回 true，反之则返回 false。
  filterOption?: (inputValue: any, option: any) => boolean
  // 可以设置为一个 作用域插槽
  footer?: any
  // 两个穿梭框的自定义样式
  listStyle?: CSSProperties
  // 各种语言
  locale?: object
  // 展示为单向样式
  oneWay?: boolean
  // 操作文案集合，顺序从上至下
  operations?: string[]
  // 操作栏的自定义样式
  operationStyle?: CSSProperties
  // 使用分页样式，自定义渲染列表下无效
  pagination?: boolean | { pageSize: number }
  // 每行数据渲染函数，该函数的入参为 dataSource 中的项，返回值为 element。或者返回一个普通对象，其中 label 字段为 element，value 字段为 title
  render?: (item: TransferOptions) => string
  // 设置哪些项应该被选中
  selectedKeys?: string[]
  // 是否显示搜索框
  showSearch?: boolean
  // 是否展示全选勾选框
  showSelectAll?: boolean
  // 显示在右侧框数据的 key 集合
  targetKeys?: string[]
  // 标题集合，顺序从左至右
  titles?: string[]
}
/**
 * 树选择
 */
interface TreeSelectParams extends BaseFormItemParams {
  //指定默认选中的条目
  defaultValue?: string | string[]
  // 下拉菜单的 className 属性
  dropdownClassName?: string
  // 下拉菜单和选择器同宽。默认将设置 min-width，当值小于选择框宽度时会被忽略。false 时会关闭虚拟滚动
  dropdownMatchSelectWidth?: boolean | number
  // 下拉菜单的样式
  dropdownStyle?: object
  // 替换 treeNode 中 title,value,key,children 字段为 treeData 中对应的字段
  fieldNames?:
    | {
        children: 'children' | string
        label: 'title' | string
        value: 'value' | string
      }
    | object
  // 是否根据输入项进行筛选，默认用 treeNodeFilterProp 的值作为要筛选的 TreeNode 的属性值
  filterTreeNode?: (inputValue: string, treeNode: TreeNode) => boolean | boolean
  // 菜单渲染父节点。默认渲染到 body 上，如果你遇到菜单滚动定位问题，试试修改为滚动的区域，并相对其定位。
  getPopupContainer?: (node: Node) => Node
  // 是否把每个选项的 label 包装到 value 中，会把 value 类型从 string 变为 {value: string, label: VNode, halfChecked(treeCheckStrictly 时有效): string[] } 的格式
  labelInValue?: boolean
  // 设置弹窗滚动高度
  listHeight?: number
  // 异步加载数据
  loadData?: (node: any) => any
  // 最多显示多少个 tag
  maxTagCount?: number
  // 隐藏 tag 时显示的内容
  maxTagPlaceholder?: any
  // 支持多选（当设置 treeCheckable 时自动变为 true）
  multiple?: boolean
  // 当下拉列表为空时显示的内容
  notFoundContent?: string
  // 搜索框默认文字
  searchPlaceholder?: string
  // 定义选中项回填的方式。TreeSelect.SHOW_ALL: 显示所有选中节点(包括父节点). TreeSelect.SHOW_PARENT: 只显示父节点(当父节点下所有子节点都选中时). 默认只显示子节点.
  showCheckedStrategy?: string
  // 在下拉中显示搜索框(仅在单选模式下生效)
  showSearch?: boolean
  // 自定义的选择框后缀图标
  suffixIcon?: VNode
  // 自定义 tag 内容，多选时生效
  tagRender?: any
  // 自定义标题
  title?: any
  // 显示 checkbox
  treeCheckable?: boolean
  // checkable 状态下节点选择完全受控（父子节点选中状态不再关联），会使得 labelInValue 强制为 true
  treeCheckStrictly?: boolean
  // treeNodes 数据，如果设置则不需要手动构造 TreeNode 节点（value 在整个树范围内唯一）
  treeData?: TreeSelectProps['treeData']
  // 使用简单格式的 treeData，具体设置参考可设置的类型 (此时 treeData 应变为这样的数据结构: [{id:1, pId:0, value:'1', label:"test1",...},...], pId 是父节点的 id)
  treeDataSimpleMode?: false | Array<object>
  // 默认展开所有树节点
  treeDefaultExpandAll?: boolean
  // 默认展开的树节点
  treeDefaultExpandedKeys?: string[] | number[]
  // 设置展开的树节点
  treeExpandedKeys?: string[] | number[]
  // 是否展示 TreeNode title 前的图标，没有默认样式，如设置为 true，需要自行定义图标相关样式
  treeIcon?: boolean
  // 是否展示线条样式
  treeLine?: boolean
  // 输入项过滤对应的 treeNode 属性
  treeNodeFilterProp?: string
  // 作为显示的 prop 设置
  treeNodeLabelProp?: string
  // 设置 false 时关闭虚拟滚动
  virtual?: boolean
}

/**
 * 树节点
 */
interface TreeNode {
  // 当树为 checkable 时，设置独立节点是否展示 Checkbox
  checkable?: boolean
  // 禁掉 checkbox
  disableCheckbox?: boolean
  // 是否禁用
  disabled?: boolean
  //是否是叶子节点
  isLeaf?: boolean
  // 此项必须设置（其值在整个树范围内唯一）
  key?: string | number
  // 是否可选
  selectable?: boolean
  // 树节点显示的内容
  title?: string
  // 默认根据此属性值进行筛选（其值在整个树范围内唯一）
  value?: string
}

/**
 * 表单项通用参数
 */
interface BaseFormItemParams {
  // 是否有边框
  bordered?: boolean
  // 支持清除, 单选模式有效 | 是否允许再次点击后清除
  allowClear?: boolean
  // 自动获取焦点
  autofocus?: boolean
  // 输入框大小，large 高度为 40px，small 为 24px，默认是 32px
  size?: 'large' | 'middle' | 'small'
  // 是否禁用
  disabled?: boolean
  // 是否显示
  show?: boolean
  // todo 为了考虑后续可扩展性，应该对没有声明的属性容许
  [key: string]: any
}

/**
 * DatePicker、 RangePicker 共享的 API。
 */
interface BaseDatePicker extends BaseFormItemParams {
  // 自定义日期单元格的内容
  dateRender?: any
  // 禁用
  disabled?: boolean
  // 不可选择的日期
  disabledDate?: (currentDate: Dayjs) => boolean
  // 额外的弹出日历 className
  dropdownClassName?: string
  // 设置输入框为只读（避免在移动设备上打开虚拟键盘）
  inputReadOnly?: boolean
  // 国际化配置
  locale?: object
  // 日期面板的状态 todo 日期
  mode?: 'time' | 'date' | 'month' | 'year' | 'decade'
  // 自定义上一个图标
  prevIcon?: any
  // 自定义下一个图标
  nextIcon?: any
  // 控制弹层是否展开
  open?: boolean
  // 设置选择器类型 todo 时间
  picker?: 'date' | 'week' | 'month' | 'quarter' | 'year'
  // 输入框提示文字
  placeholder?: string | [string, string]
  // 额外的弹出日历样式
  popupStyle?: CSSProperties
  // 自定义的选择框后缀图标
  suffixIcon?: any
  // 自定义 << 切换图标
  superNextIcon?: any
  // 自定义 >> 切换图标
  superPrevIcon?: any
  // 可选，绑定值的格式，对 value、defaultValue、defaultPickerValue 起作用。不指定则绑定值为 dayjs 对象
  valueFormat?: string
}

/**
 * 基础字段参数
 * todo 包含多个表单组件的选项
 */
interface BaseFieldNames {
  // 显示属性名
  label: string
  // 显示值属性名
  value: string | number
  // 子节点名称
  children?: string | BaseFieldNames[]
  // 是否禁用
  disabled?: boolean
  // 标记是否为叶子节点，设置了 `loadData` 时有效 设为 `false` 时会强制标记为父节点，即使当前节点没有 children，也会显示展开图标
  isLeaf?: boolean
  // Option 器类名
  class?: string
  // 和 value 含义一致。如果 Vue 需要你设置此项，此项值与 value 的值相同，然后可以省略 value 设置
  key?: string
  // 选中该 Option 后，Select 的 title
  title?: string
  // 父选项
  options?: BaseFieldNames[]
}

/**
 * 值选项
 */
interface ValueOptions {
  value: string
}
/**
 * 表单项Options
 */
declare type BaseOptions =
  | BaseFieldNames
  | Array<any>
  | SelectProps['options']
  | CascaderProps['options']
  | TreeSelectProps['treeData']
  | Array<ValueOptions>

export type {
  AutoCompleteParams,
  CascaderParams,
  BaseFieldNames,
  BaseOptions,
  BaseFormItemParams,
  CheckBoxParams,
  DatePickerParams,
  RangePickerParams,
  InputParams,
  InputNumberParams,
  MentionsParams,
  RadioParams,
  RateParams,
  SelectParams,
  SliderParams,
  SwitchParams,
  TimePickerParams,
  TransferParams,
  TreeSelectParams,
  TimeRangePickerParams,
  ValueOptions,
  TransferOptions,
}
